package main

/*
Go 语言支持匿名函数，可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量，不必申明。

以下实例中，我们创建了函数 getSequence() ，返回另外一个函数。该函数的目的是在闭包中递增 i 变量，代码如下：
*/
import "fmt"

func getSequence() func() int {
	i := 0
	return func() int {
		i += 1
		return i
	}
}

func main() {
	//nextNumber 是一个函数，函数 i 为 0
	nextNumber := getSequence()
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	//创建新的函数nextNumber1
	nextNumber1 := getSequence()
	fmt.Println(nextNumber1())
	fmt.Println(nextNumber1())

	add_func := add(1, 2)
	fmt.Println(add_func(4, 5))
	fmt.Println(add_func(2, 8))
	fmt.Println(add_func(5, 2))
}

/*
带参数的闭包使用,函数申明中的返回值（闭包函数）不用写具体的形参数名
*/
func add(x1, x2 int) func(int, int) (int, int, int) {
	i := 0
	return func(x3 int, x4 int) (int, int, int) {
		i += 1
		return i, x1 + x2, x3 + x4
	}
}
